package mercadologico.entities.tables;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

import exceptions.PersistenceExceptionMessage;
import generic.interfaces.GenericPersistence;
import generic.interfaces.IDEntity;
import generic.interfaces.PersistInFile;
import mercadologico.dao.PersistenceMedidaEmbalagem;

@Entity
public class MedidaEmbalagem implements IDEntity<Integer>, GenericPersistence<PersistenceMedidaEmbalagem, Integer, MedidaEmbalagem>, PersistInFile<MedidaEmbalagem>, Comparable<MedidaEmbalagem> {

	public static PersistenceMedidaEmbalagem persist = new PersistenceMedidaEmbalagem();
	
	@Id
	private Integer id;
	@Column(length=2)
	private String descricao;
	private String unidadeInternacional;
	private Double fatorConvercao;
	// I - Inteiro e F - flutuante
	@Column(length=1)
	private Character tipoMedida;
	
	
	public Integer getId() {
		return this.id;
	}
	
	public void setId(Integer id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getUnidadeInternacional() {
		return unidadeInternacional;
	}
	public void setUnidadeInternacional(String unidadeInternacional) {
		this.unidadeInternacional = unidadeInternacional;
	}
	public Double getFatorConvercao() {
		return fatorConvercao;
	}
	public void setFatorConvercao(Double fatorConvercao) {
		this.fatorConvercao = fatorConvercao;
	}
	public Character getTipoMedida() {
		return tipoMedida;
	}
	public void setTipoMedida(Character tipoMedida) {
		this.tipoMedida = tipoMedida;
	}
	
	public int compareTo(MedidaEmbalagem mu) {
		return getDescricao().compareTo(mu.getDescricao());
	}

	
	public MedidaEmbalagem getInstanceFromArray(String[] str) {
		for (String string : str) {
			if (string == null)
				return null;
			if (string.trim().length() == 0)
				return null;
		}

		if (str != null && str.length == 5) {
			MedidaEmbalagem mu = new MedidaEmbalagem();
			mu.setId(Integer.parseInt(str[0]));
			mu.setDescricao(str[1]);
			mu.setUnidadeInternacional(str[2]);
			try {
				mu.setFatorConvercao(Double.parseDouble(str[3]));
			} catch (NumberFormatException e) {
				return null;
			}
			mu.setTipoMedida(str[4].charAt(0));
			return mu;
		}
		return null;
	}

	
	public Collection<MedidaEmbalagem> order(ArrayList<MedidaEmbalagem> entities) {
		Collections.sort(entities);
		return entities;
	}

	
	public int removeAll() throws PersistenceExceptionMessage {
		return DAOInstance().removeAll();
	}

	
	public ArrayList<String> getArrayAsString()
			throws PersistenceExceptionMessage {
		ArrayList<String> strs = new ArrayList<String>();
		for (MedidaEmbalagem mu : order((ArrayList<MedidaEmbalagem>) DAOInstance().findAll())) {
			strs.add(mu.getId() +"|" +getDescricao() +"|" +getUnidadeInternacional() 
					+"|" +getFatorConvercao() +"|" +getTipoMedida());
		}
		return strs;
	}

	
	public PersistenceMedidaEmbalagem DAOInstance()
			throws PersistenceExceptionMessage {
		if (persist == null) {
			persist = new PersistenceMedidaEmbalagem();
		}
		return persist;
	}

	
	public MedidaEmbalagem find(Integer id) throws PersistenceExceptionMessage {
		return DAOInstance().find(id);
	}

	
	public void persist() throws PersistenceExceptionMessage {
		DAOInstance().persist(this);
	}

	
	public void remove() throws PersistenceExceptionMessage {
		DAOInstance().remove(this);
	}

	
	public MedidaEmbalagem merge() throws PersistenceExceptionMessage {
		return DAOInstance().merge(this);
	}

	
	public ArrayList<MedidaEmbalagem> findAll()
			throws PersistenceExceptionMessage {
		return (ArrayList<MedidaEmbalagem>) DAOInstance().findAll();
	}
	public Object getInstanciaTipo() {
		if (getTipoMedida() == 'I')
			return new Integer(0);
		if (getTipoMedida() == 'F')
			return new Double(0.0);
		return null;
	}
	public String getMascaraTipo() {
		if (getTipoMedida() == 'I')
			return "#,###";
		if (getTipoMedida() == 'F')
			return "#,##0.0";
		return null;
	}
	
	public String toString() {
		return getDescricao();
	}
	
	public boolean equals(Object obj) {
		if (obj instanceof MedidaEmbalagem) {
			MedidaEmbalagem mu = (MedidaEmbalagem) obj;
			return getId().equals(mu.getId()) && getDescricao().equals(mu.getDescricao());
		}
		return false;
	}
}
